-- data SALA
import IO
import Char
import System.Directory
import System.Time
import System.Locale
import System.Environment
type Rzedy = Int
type Kolumny = Int  -- ilosc miejsc tupol z numerem rzedu -> ilosc miejsc
type Nazwa = String
type ID	= Int

-- konstruktor SALI
data Sala = Sala ID Nazwa Rzedy Kolumny deriving Show


--createDir d = do {
---				createDirectory d;
--			}

sciezka = getCurrentDirectory
sciezkaSale = "d:/haskell/sale.txt"
sciezkaRezerwacja = "d:/haskell/rezerwacje.txt"
sciezkaSprzedaz = "d:/haskell/sale.txt"
sciezkaSeanse = "d:/haskell/seanse.txt"
temp = "d:/haskell/temp.txt"

--main :: IO ()
main = doMain
doMain =  do{
            	
					putStrLn "\nSale: ";
            		putStrLn "--------------------------------------------------------------------------";
            		putStrLn " a) dodaj \t  b) modyfikuj \t  c) usun \t  d) wyswietl \t ";
            		putStrLn "--------------------------------------------------------------------------";
            		putStrLn "Seanse: ";
            		putStrLn "--------------------------------------------------------------------------";
            		putStrLn " g) dodaj \t  h) modyfikuj \t  i) usun \t  j) wyswietl \t ";
            		putStrLn "--------------------------------------------------------------------------";
            		putStrLn "Rezerwacje: ";
            		putStrLn "--------------------------------------------------------------------------";
            		putStrLn " k) dodaj \t  l) usun \t";
					putStrLn "--------------------------------------------------------------------------";
           		 	putStrLn "Sprzedaz: ";
            		putStrLn "--------------------------------------------------------------------------";
            		putStrLn " m) dodaj \t  n) usun \t";
					putStrLn "--------------------------------------------------------------------------";
					n <- getLine;
				case n of
					"a" -> do{
							putStrLn "Podaj nazwe sali";
							nazwa <- getLine;
							putStrLn "Podaj ilosc rzedow";
							rows <- getLine;
							wynik <- return(jestLiczba rows);
							wynik2 <- return(jestWiekszeOd0 rows);
							if (( wynik == True)&&( wynik2 == True)) then do {
								putStrLn "Podaj ilosc miejsc ";
								cols <- getLine; 
								wynik <- return(jestLiczba cols);
								wynik2 <- return(jestWiekszeOd0 cols);
								if (( wynik == True)&&( wynik2 == True)) then do {
									putStrLn "dane ok";
									dodajRekordSale sciezkaSale rows cols nazwa;
									doMain;
								}
								else do {
									putStrLn "Bledne dane! Wcisnij klawisz aby kontynuowac";
									temp <- getLine;
									doMain;
								}
							}
							else  do {
								putStrLn "Bledne dane! Wcisnij klawisz aby kontynuowac";
								temp <- getLine;
								doMain;
							}
                		}
					"b" -> do{
							doMain;			
                		}
					"c" -> do{
							doMain;			
                		}
					"d" -> do{
							doMain;			
                		}
					"g" -> do{
							putStrLn "Podaj nazwe Filmu";
							nazwa <- getLine;
							putStrLn "Podaj ID sali";
							idsali <- getLine;
							
							check <- (zwrocRezerwacjeSeansu sciezkaSale idsali);
							putStrLn check;
							
							--sala ?
							wynik <- return(jestLiczba idsali);
							wynik2 <- return(jestWiekszeRowne0 idsali);
							if (( wynik == True)&&( wynik2 == True)) then do {
								putStrLn "Podaj date w formacie YYYYmmDDhhMM ";
								dataSeansu <- getLine; 
								today <- zwrocDate;
								if (((length dataSeansu) == 12)&&(sprawdzDate dataSeansu today)&&(sprawdzMozliwosc dataSeansu)) then do {
									putStrLn "dane ok";
									-- tutaj 
									dodajRekordSeans sciezkaSeanse idsali nazwa dataSeansu;
									doMain;
								}
								else do {
									putStrLn "Bledne dane! Wcisnij klawisz aby kontynuowac";
									temp <- getLine;
									doMain;
								}
							}
							else  do {
								putStrLn "Bledne dane! Wcisnij klawisz aby kontynuowac";
								temp <- getLine;
								doMain;
							}			
                		}
					"h" -> do{
							doMain;			
                		}
					"i" -> do{
							doMain;			
                		}
					"k" -> do{
							wyswietlSeanse sciezkaSeanse;
							putStrLn "Podaj id seansu";
							idSeansu <- getLine;
							wyswietlRezerwacjeSeansuNaEkran sciezkaRezerwacja idSeansu;
							
							putStrLn "Podaj rzad";
							rows <- getLine;
							putStrLn "Podaj miejsce";
							cols <- getLine;
							
							dodajRekordRezerwacja sciezkaRezerwacja idSeansu rows cols;
							doMain;		
                		}
					"l" -> do{
							doMain;			
                		}
					"m" -> do{
							doMain;			
                		}
					"n" -> do{
							doMain;			
                		}
						
								 
					"w" -> return ()
					_  -> doMain
			}
doStanSal = do putStrLn ("Wybrano 1")


--sciezkaa = sciezka : "zupa.txt"



doRead fname = do
				  handler <- openFile fname ReadMode
				  contents <- hGetLine handler
				  
				  --x <- return $ contents
				  --putStrLn x
				  --y <- return $ zmienWiersze $ lines contents
				  --putStrLn $ head $ head $ take 1 $ zmienWiersze $ lines x
				  wczytajWiersz handler
				  hClose handler
				

--zmienWiersze :: 
zmienWiersze[] = []
zmienWiersze(x:xs) = words x : zmienWiersze(xs)    


dodajRekordSale fname rows cols name= do
					
					handler <- openFile fname ReadMode
					contents <- hGetContents handler					 
					let x = ileLini contents
					putStrLn $ show $x+1
					hClose handler
					
					
					handler <- openFile fname AppendMode
					hPutStrLn handler ((show $x+1)++" "++name++" "++rows++" "++cols)
					hClose handler
dodajRekordSeans fname idSali name dataSeansu = do
					
					handler <- openFile fname ReadMode
					contents <- hGetContents handler					 
					let x = ileLini contents
					putStrLn $ show $x+1
					hClose handler
					
					
					handler <- openFile fname AppendMode
					hPutStrLn handler ((show $x+1)++" "++idSali++" "++name++" "++dataSeansu)
					hClose handler

dodajRekordRezerwacja fname idSeansu rows cols = do
					
					handler <- openFile fname ReadMode
					contents <- hGetContents handler					 
					let x = ileLini contents
					putStrLn $ show $x+1
					hClose handler
					
					
					handler <- openFile fname AppendMode
					hPutStrLn handler ((show $x+1)++" "++idSeansu++" "++rows++" "++cols)
					hClose handler						
					
					
string2int [] = 0
string2int [x] | isDigit x == True = digitToInt x
			   | otherwise = 0
string2int (x:xs) | isDigit x == True = 10^length xs * digitToInt x + string2int xs
				  | otherwise = 0
				  
ileLini contents = length $ lines $ contents 

-- funkcja sprawdza, czy zadany string jest liczba
jestLiczba [] = False
jestLiczba [x] = if isDigit x then True
				 else False
jestLiczba (x:xs) = if isDigit x then jestLiczba xs
					else False
					
-- funkcja sprawdza, czy zadany string jest tekstem
jestTekstem [] = False
jestTekstem [x] = if isAlpha x then True
				  else False
jestTekstem (x:xs) = if isAlpha x then jestTekstem xs
					 else False


jestWiekszeOd0 [] = False
jestWiekszeOd0 x = if (string2int $ x) > 0 then True
						else False
						
jestWiekszeRowne0 [] = False
jestWiekszeRowne0 x = if (string2int $ x) > -1 then True
						else False
						
dzienOk[] = False
dzienOk x = if ((string2int $ x) > 0) && ((string2int $ x) < 32) then True
			else False

miesiacOk[] = False
miesiacOk x = if ((string2int $ x) > 0) && ((string2int $ x) < 13) then True
			else False;
			
rokOk[] = False
rokOk x = if ((string2int $ x) > 2010) && ((string2int $ x) < 9999) then True
			else False;
			
godzinaOk[] = False
godzinaOk x = if ((string2int $ x) > -1) && ((string2int $ x) < 24) then True
			else False;
			
minutaOk[] = False
minutaOk x = if ((string2int $ x) > -1) && ((string2int $ x) < 60) then True
			else False;
			
-- funkcja sluzaca do porownywania dat jezeli x:xs > d:ds to true
sprawdzDate [] [] = True
sprawdzDate (x:xs) [] = False
sprawdzDate (x:xs) (d:ds) = if x == ' ' then False
                            else if x> d then True
                            else if x==d then sprawdzDate xs ds
                            else if x<d then False
                            else False
							
wezDzien x = do {
							dd <- (reverse $ take 2 $ reverse $ take 8 x);
							return $ dd;
						}
						
wezMiesiac x = do {
							dd <- (reverse $ take 2 $ reverse $ take 6 x);
							return $ dd;
						}

wezGodzine x = do {
							dd <- (reverse $ take 2 $ reverse $ take 10 x);
							return $ dd;
						}

wezMinute x = do {
							dd <- (reverse $ take 2 $ reverse $ take 12 x);
							return $ dd;
						}

wezRok x = do {
							dd <- (take 4 x);
							return $ dd;
						}
						
zwrocDate = do {
				time <- (getClockTime >>= toCalendarTime);
				return $ formatCalendarTime defaultTimeLocale "%Y%m%d%H%M" time;	
			}
			
sprawdzMozliwosc [] = False
sprawdzMozliwosc xs = if ((dzienOk (wezDzien xs))&&(miesiacOk (wezMiesiac xs))&&(rokOk (wezRok xs))&&(godzinaOk (wezGodzine xs))&&(minutaOk (wezMinute xs)) ) then True
						else False;
	

  					
wczytajWiersz hdl = do {
							t <- hIsEOF hdl;						
							if t then return()
							else do {
								contents <- hGetLine hdl;
								x<-return(contents);
								--putStrLn $ head $ head $ take 1 $ zmienWiersze $ lines x;
								if x == [] then return()
								else putStrLn contents;
								wczytajWiersz hdl 
							}
						}	  
						
wyswietlSeanse fname = do
					
					handler <- openFile fname ReadMode
					contents <- hGetContents handler					 
					putStrLn contents
					hClose handler


-- id seansu 					

					
zwrocRezerwacjeSeansu fname idSeansu = do
					handler <- openFile fname ReadMode
					check <- (szukajWierszOId handler idSeansu);
					hClose handler
					return $ check;					


szukajWierszOId hdl idSeansu = do {
							t <- hIsEOF hdl;						
							if t then return $ "no"
							else do {
								contents <- hGetLine hdl;
								x<-return(contents);
								
								if x == [] then return $ "no"
								else do {
										if ((head(words x)) == idSeansu) then do {
										
											--szukajWierszOId hdl idSeansu;
											--putStrLn x;
											return $ "yes";
											
										}	
									else do {
										
										
										szukajWierszOId hdl idSeansu;
										--return ()
									}
								}
								
							}
						}
						
-------------------------------------------------
--moje
						
						
wyswietlRezerwacjeSeansuNaEkran fname idSeansu = do
					handler <- openFile fname ReadMode
					wczytajWierszOId handler idSeansu
					hClose handler
					
					
					

wczytajWierszOId hdl idSeansu = do {
							t <- hIsEOF hdl;						
							if t then return()
							else do {
								contents <- hGetLine hdl;
								x<-return(contents);
								
								if x == [] then return()
								else do {
										if (head(tail(words x)) == idSeansu) then do {
											wczytajWierszOId hdl idSeansu;
											putStrLn x;						
										}	
									else do {										
										wczytajWierszOId hdl idSeansu;
									}
								}
							}
						}

-----usuwanie

usunWpisOId hdl thdl idSeansu  = do {
							t <- hIsEOF hdl;						
							if t then return()
							else do {
								contents <- hGetLine hdl;
								x<-return(contents);
								
								if x == [] then return()
								else do {
										if (head(words x) == idSeansu) then do {
											hPutStrLn thdl " ";
											usunWpisOId hdl thdl idSeansu;
										}	
									else do {
										hPutStrLn thdl x;
										usunWpisOId hdl thdl idSeansu;
										
									}
								}
								
							}
						}	  
						
doDelete fname ftemp idd = do
				  
				  tempHandler <- openFile ftemp WriteMode
				  handler <- openFile fname ReadMode

				  usunWpisOId handler tempHandler idd; 
				  hClose handler;
				  hClose tempHandler;
				  
				  zmienPliki fname ftemp	    

				

zmienPliki fname ftemp = do
				 removeFile fname
				 renameFile ftemp fname  